package entity.zhujie.lianxi.test.demo05;

import entity.zhujie.lianxi.test.demo05.zhujie.JIanKang;
import entity.zhujie.lianxi.test.demo05.zhujie.ShuiMian;

import java.lang.reflect.Method;

/*
* 饲养员 -- 定义成一个泛型类（可以饲养任意类型的对象） + 边界（对象一定是动物）
* */
public class SiYangYuan<T extends Animal>{
    /*
    * 巡查动物 -- 用来查看动物睡眠状况好不好  -- 解析 ShuiMian 的注解
    * */
    public void xunCha(T animal){
        //第一步：获取操作类的Class对象  --Class<? extends Animal> 通配符的上界：实现泛型的协变，泛型父类
        Class<? extends Animal> aClass = animal.getClass();
        try {
            //获取水面的方法
            Method method = aClass.getDeclaredMethod("sleep");
            //判断是否存在ShuiMian 注解
            if (method.isAnnotationPresent(ShuiMian.class)) {
                //存在，则获取注解的值
                String value = method.getAnnotation(ShuiMian.class).value();
                //4.逻辑处理
                if ("失眠".equals(value)){
                    System.out.println("吃了一个安眠药");
                }
            }
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
        //基于:Class对象实现相关的操作
        System.out.println("开始巡查");
    }

    /*
     * 体检动物 -- 用来查看动物睡眠状况好不好  -- 解析 ShuiMian 的注解
     * */
    public void TiJian(T animal) {
        //第一步：获取操作类的Class对象  --Class<? extends Animal> 通配符的上界：实现泛型的协变，泛型父类
        Class<? extends Animal> aClass = animal.getClass();
        try {
            //获取SHuiman的方法
            Method method = aClass.getDeclaredMethod("sleep");
            //判断是否存在JIanKang注解
            if (method.isAnnotationPresent(JIanKang.class)) {
                //存在，则获取注解的值
                String value = method.getAnnotation(JIanKang.class).value();
                //4.逻辑处理
                if ("差".equals(value)) {
                    System.out.println("特表照看");
                }
            }
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
        //基于:Class对象实现相关的操作
        System.out.println("开始体检");
    }
}
